public class MyArrayList {

    private int[] arr;

    //表示有效元素的个数
    private int size = 0;

    //无参数的构造方法
    public MyArrayList() {
        arr = new int[10];
    }

    //有参数的构造方法
    public MyArrayList(int capacity) {
        arr = new int[capacity];
    }


    //1.获取元素个数
    public int size() {
        return size;
    }

    //2.尾插元素
    public void add(int val) {
        //如果满了，先扩容
        if(size == arr.length) {
            resize();
        }
        //插入元素
        arr[size] = val;
        size++;
    }

    //3.任意位置插入元素
    public void add(int index,int val) {
        //先判断下标是否合法
        if(index < 0 || index >= size) {
            throw new IndexOutOfBoundsException("Index out of bounds");
        }

        //如果数组满了，要扩容
        if(size == arr.length) {
            resize();
        }

        //如果下标是尾部，则是尾部插入
        if(index == size-1) {
            add(val);
            return;
        }

        //中间插入
        for (int i =size-1 ; i >= index ; i--) {
            arr[i + 1] = arr[i];
        }
        arr[index] = val;
        size++;
    }

    //4.根据下标获取元素
    public int get(int index) {
        //判断下标是否合法
        if(index < 0 || index >= size) {
            throw new IndexOutOfBoundsException("Index out of bounds");
        }
        return arr[index];
    }

    //5.根据下标设置元素
    public void set(int index,int val) {
        //判断下标是否合法
        if(index < 0 || index >= size) {
            throw new IndexOutOfBoundsException("Index out of bounds");
        }
        arr[index] = val;
    }

    //6.根据下标删除元素
    public void remove(int index) {
        //判断下标是否合法
        if(index < 0 || index >= size) {
            throw new IndexOutOfBoundsException("Index out of bounds");
        }

        //下标如果是最后一个元素
        if(index == size-1) {
            arr[index] = 0;
            size--;
            return;
        }

        //删除中间元素
        int i =0;
        for ( i = index ; i < size - 1 ; i++) {
            arr[i] = arr[i + 1];
        }
        size--;
    }

    //7.根据值删除元素
    public void delete(int val) {
       int index = 0;
       for(;index < size;index++) {
           if(arr[index] == val) {
               break;
           }
       }

       if(index == size) {
           return;
       }

       for(int i = index ;i < size - 1 ; i++) {
           arr[i] = arr[i+1];
       }
       size--;
    }

    //8.判断元素是否存在
    public boolean contains(int val) {
        for (int i = 0; i < size; i++) {
            if(arr[i]==val) {
                return true;
            }
        }
        return false;
    }

    //9.从头开始查找元素所在下标
    public int indexOf(int val) {
        for (int i = 0; i < size; i++) {
            if(arr[i]==val) {
                return i;
            }
        }
        return -1;
    }

    //10.从最后开始查找元素所在下标
    public int LastindexOf(int val) {
        for (int i = size-1; i >= 0; i--) {
            if(arr[i]==val) {
                return i;
            }
        }
        return -1;
    }

    //11.清除所有元素
    public void clear() {
        size=0;
    }

    //扩容功能
    public void resize() {

        int[] arrling = new int[(int)(arr.length * 1.5)];

        for (int i = 0; i < size ; i++) {
            arrling[i] = arr[i];
        }

        arr = arrling;
    }

    public String toString() {
        // 打印的格式形如: [1, 2, 3, 4]
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("[");
        for (int i = 0; i < size; i++) {
            stringBuilder.append(arr[i]);
            if (i < size - 1) {
                // i == size -1 时, 就是最后一个元素, 最后一个元素不添加 ,
                stringBuilder.append(", ");
            }
        }
        stringBuilder.append("]");
        return stringBuilder.toString();
    }



    private static void test1() {
        MyArrayList list = new MyArrayList();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
        list.add(6);
        list.add(7);
        list.add(8);
        list.add(9);
        list.add(10);
        list.add(17);
        System.out.println(list);
    }

    private static void test2() {
        MyArrayList list = new MyArrayList();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
        list.add(6);
        list.add(7);
        list.add(8);
        list.add(9);
        list.add(10);
        list.add(9,100);
        System.out.println(list);
    }


    private static void test3() {
        MyArrayList list = new MyArrayList();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
        list.add(6);
        list.add(7);
        list.add(8);
        list.add(9);
        list.add(10);
        list.add(11);
        list.add(12);
        list.remove(10);
        list.clear();
        System.out.println(list);
    }



    //主函数测试方法
    public static void main(String[] args) {

        //test1();
        //test2();
        test3();

    }

}
